批量提交BT种子到Aria2下载

语言编程

概况

家里的 NAS 是我主要文件存储系统,Aria2 作为日常常用下载工具也一同部署在上面。

该 Aria2 以docker 容器的形式部署,这样可以带来更好的独立性以便于日常维护。由于众所周知的原因,尝试过一段时间通过 openwrt 对其进行留学分流,但效果不是太理想。总会发生偶发性的偷跑流量情况,且会损失部分下载速度。为避免钱袋受到伤害,最终还是把 Aria2 设置为直连方式下载。

aria2NG

直连方式也带来一个问题:部分种子在墙外被限制直连,若直接将链接地址发送到 Aria2,是无法被正确下载的。每次遇到这种情况,我只能先通过浏览器把种子文件下载下来后,再通过Aria2NG发种子发送到 Aria2 进行下载,显得比较繁琐。Aria2NG 也有一个问题:每次只能上传一个种子。如果有多个种子文件,操作就显得相当机械繁琐而无趣。我想,能不能一步到位直接把下载好的种子文件统一推送到 Aria2 自行下载呢?搜索了一下,果然有老哥为此建了个项目,该项目是通过 xmlrpc 的方式管理 Aria2,但缺少密钥验证功能。因此我拿该大佬的项目改了一下,以支持密钥验证方式。有需要的朋友可以直接抄下作业。

实现我需求的思路主要是两个部分,第一部分是脚本处理,第二部分是系统快捷键的部署(我的是 MacOS,win 部分可能需要一些系统快捷键软件支持才能实现)。

批量提交 BT 文件到 Aria2

脚本

import xmlrpc.client import xmlrpc import os import argparse def handle(s, btFile, token): print('handle bittorrent file: ', str(btFile)) token = "token:" + token ret=s.aria2.addTorrent(token,xmlrpc.client.Binary(open(btFile, mode='rb').read()),[],{'pause':'true'}) print("add bt: ",str(ret)) waiting = s.aria2.tellWaiting(token,0, 1000, ["gid", "totalLength", "completedLength", "uploadSpeed", "downloadSpeed", "connections", "numSeeders", "seeder", "status", "errorCode", "verifiedLength", "verifyIntegrityPending", "files", "bittorrent", "infoHash"]) for w in waiting: gid=w['gid'] if gid!=ret: continue #print(w['gid'],w['files']) # max-selection strategy maxLen=0 maxFPath='' maxFIndex='0' for f in w['files']: #print(f['length'],f['path']) if int(f['length'])>maxLen: maxLen=int(f['length']) maxFPath=f['path'] maxFIndex=f['index'] print('max file: ',str(maxLen),maxFIndex,str(maxFPath)) # max-selection strategy end cret=s.aria2.changeOption(token,gid,{'select-file':maxFIndex})# select multiple files example: 'select-file':'5,6,7,8' print('select file: ',cret) tret=s.aria2.tellStatus(token,gid) print('after selection: ', tret['files'][int(maxFIndex)-1]) uret=s.aria2.unpause(token,gid) print('unpause: ',uret) print('over: ',str(btFile)) if  == "": parser = argparse.ArgumentParser() parser.description = 'bt 批量导入 aria2,并选择文件大小最大的文件进行下载' parser.add_argument("server", help="like: http://192.168.3.99:6800", type=str)
    parser.add_argument("token", help="验证密钥", type=str) parser.add_argument("dir", help="存放种子目录", type=str)
    args = parser.parse_args() s = xmlrpc.client.ServerProxy(args.server+"/rpc") flist=os.listdir(args.dir) for i in range(0, len(flist)): if flist[i].endswith(".torrent"): btFile = os.path.join(args.dir, flist[i]) if os.path.isfile(btFile): handle(s,btFile, args.token) print("Done") 

使用方法

把上述代码保存为bb2a.py,需要使用 Python3 运行。

帮助(Help):

python3 bb2a.py --help 

启动(Start to Add):

python3 bb2a.py <server> <token> <bt-dir> 

参数(parameters):

server 如(like): http://192.168.3.99:6800 token 验证密钥:设置在 Aria2 配置文件的密钥 bt-dir bt 文件的目录(the dir of your bittorrents) 

例子(example):

python3 /path/to/bb2a.py http://192.168.1.100:6800 123456 /home/root/bts/ 

MacOS 增加快捷指令

command + 空格,在快捷运行窗口输入“快捷指令”打开系统的快捷指令模块。点击窗口右上角➕新增一个快捷指令。
新增快速指令1.png

按照下图方式创建快捷指令内容
新增快速指令2.png

参考 shell 内容如下,请按照自己配置情况修改相关参数。sleep 3是暂停 3 秒。后面的 rm 命令是顺便删除下载目录中的 bt 种子文件。

python3 /Users/ccchen/autobt/bb2a.py http://192.168.12.5:6800 123456 /Volumes/FAT12T/down2025/ sleep 3 rm -f /Volumes/FAT12T/down2025/*.torrent

按窗口右上角的详情按钮,设置快捷指令的允许执行 shell 权限。
新增快速指令3.png

最后给快捷指令设置快捷键.我设置的快捷键是“Ctrl + Option + W”这个组合键。
新增快速指令4.png

完结

到此,所有配置已完成。只要下载 bt 种子到对应的目录。完毕后按快捷键“Ctrl + Option + W”,脚本便自动将该目录中所有种子文件发送到 aria2 进行下载。同时会把下载目录中对应的种子清理掉。

添加新评论